#ifndef _SCENE_H
#define _SCENE_H

#include "Animation.h"
#include "Image.h"

//! The structure Scene stores all texture Id or images used by the sceneDraw fonction
/**
 * @struct Scene
 * @brief Structure utilisée pour la gestion des textures et animations.
 *
 * cette structure est utilisée dans la définition des differentes types de textures
 */
struct Scene
{
    Animation anim;
	unsigned int tex_tree;

	Image terrain;
	unsigned int tex_terrain;

	Animation anim_camion;
	unsigned int cubemap1 ;
	unsigned int cubemap2 ;
	unsigned int cubemap3 ;
	unsigned int cubemap4 ;
	unsigned int cubemap5 ;
	unsigned int cubemap6 ;
	unsigned int tex_monde;
	unsigned int tex_soleil;
	unsigned int tex_lune;

	int pos[40][3];
};

/**
*   Partie ajoutée TP
*
*/
/** @brief Dessiner le Terrain en chargeant l'image et la texture */
void dessineTerrain(const    Image&  im);
/** @brief construction de la normale du Terrain */
void normalTerrain(const Image&  im,int i,int   j);



/** @brief dessine un cubmap avec 6 surfaces qui prennent 6 images differentes */
void cubmap();

/** @brief construction d'un arbre */
void dessine_arbre();

/** @brief dessine une foret avec un nombre specefique d'arbre */
void dessine_foret( const Scene& sc);

/** @brief Dessiner camion avec cube, cylindre .... */
void dessine_camion(const Scene& sc);

/** @brief Animation du camion*/
void anim_camion(const Scene& sc);

/** @brief Construction le trajet du camion, rotatif ou rectiligne */
void trajet_camion(const Scene& sc);

/** @brief creation de la rotation de la Terre */
void rotation_terre();

/** @brief Animation de la Terre avec la Texture */
void anim_terre(const Scene& sc);

/** @brief Animation de la lune avec la Texture */
void anim_lune(const Scene& sc);

/** @brief A utiliser dans le cas ou on veut dessiner notre propre arbre avec des Y */
float fRand();
/** @brief A utiliser dans le cas ou on veut dessiner notre propre arbre avec des Y */
void dArbre(int niveau, float l);
/** @brief A utiliser dans le cas ou on veut dessiner notre propre arbre avec des Y */
void dessine_arbre_avc_branches(const Scene& sc);

/*************** FIN *******************/


//! Init a Scene
void sceneInit(Scene& sc);

//! Draw the scene
void sceneDraw(const Scene& sc);


//! Draw a cube
void draw_cube();

//! Draw a cylinder
void draw_cylinder();

//! Draw a cone
void draw_cone();

//! Draw a sphere
void draw_sphere();

//! Draw the X,Y,Z axes
void draw_axes();

//! Draw a grid in the XZ plane
void draw_grid();


#endif
